<%@ page language="java"
         import="java.awt.*"
         import="java.awt.image.BufferedImage"
         import="java.util.*"
         import="javax.imageio.ImageIO"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<c:set var="characterEncoding" value="UTF-8" scope="request" />

<html lang="zh-CN">
<body>
<%
    // 设置响应内容类型为JPEG图像，并指定字符编码为UTF-8
    response.setContentType("image/jpeg;charset=utf-8");
    // 设置HTTP头信息，禁止缓存
    response.setHeader("Cache-Control", "no-cache");

    // 定义图像的宽度和高度
    int width = 80, height = 30;
    // 创建一个BufferedImage对象，用于绘制图像
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    // 获取Graphics对象，用于在图像上绘图
    Graphics g = image.getGraphics();

    // 设置背景颜色为灰色，并填充整个图像区域
    g.setColor(new Color(200, 200, 200));
    g.fillRect(0, 0, width, height);

    // 定义验证码字符集
    String chars = "ABCDEFGHJKMNOPQRSTUVWXYZabcdefghjkmnopqrstuvwxyz23456789";
    // 创建一个Random对象，用于生成随机数
    Random rnd = new Random();
    // 使用StringBuilder来构建随机字符串
    StringBuilder randStr = new StringBuilder(4);
    // 循环4次，每次从字符集中随机选择一个字符，添加到randStr中
    for (int i = 0; i < 4; i++) {
        randStr.append(chars.charAt(rnd.nextInt(chars.length())));
    }

    // 将生成的随机字符串存储到session中，以便后续验证
    session.setAttribute("randStr", randStr.toString());
    // 设置字体颜色为黑色，并设置字体样式和大小
    g.setColor(Color.black);
    g.setFont(new Font("Arial", Font.PLAIN, 24));
    // 在图像上绘制随机字符串
    g.drawString(randStr.toString(), 10, 24);

    // 在图像上绘制100个随机位置的小圆点，增加干扰效果
    for (int i = 0; i < 100; i++) {
        int x = rnd.nextInt(width);
        int y = rnd.nextInt(height);
        g.drawOval(x, y, 1, 1);
    }
    // 将生成的图像写入响应输出流，以JPEG格式输出
    ImageIO.write(image, "JPEG", response.getOutputStream());
    // 清空输出缓冲区
    out.clear();
    // 推送新的输出缓冲区
    out = pageContext.pushBody();
%>
</body>
</html>
